#ifndef INDICEARBOL_H_
#define INDICEARBOL_H_

#include "arbol/Arbol.h"
#include "Elemento.h"
#include "Indice.h"
#include "../claves/TipoClave.h"
#include "../claves/Key.h"

class IndiceArbol: public Indice{

private:
	Arbol arbol;
	std::string url;

	/*
	 * URL es el path del recurso, si ya estaba indexado incializa el arbol
	 * con el indice exitente. Sino el indice queda vacio.
	 * */

public:
	IndiceArbol(TipoClave* extractor,std::string url, cantBytes tamanioMaxClave,int orden);

	/*Retorna true si la clave ya se encuentra indexada.*/
	bool existeClave(Key clave);

	/* Dado un recurso, lo recorre indexando en un b# (clave,offset).
	 * Una vez recorrido todo el recurso de almacenamiento se guarda
	 * el indice en disco.
	 * El nombre del indice se forma de la siguiente manera:
	 *  pathRecurso_idextractor.bsi (B Sharp Index)
	 *
	 *  Si el indice existia lo sobreescribe.
	 */
	bool indexar(RecursoDeAlmacenamiento* recurso);
	/*
	 * Busca el offset asociado a la clave.
	 */
	bool getNumComponente(Key clave,offset& numComponente);
	/*
	 * Agrega un elemento al indice.
	 * Elemento = conjunto [clave,offset]
	 */
	bool agregar(Key clave, offset numComponente);
	/*
	 * Borra un elemento del indice.
	 * Elemento = conjunto [clave,offset]
	 */
	bool quitar(Key clave, offset& numComponente);

	void visualizar();

	virtual ~IndiceArbol();
};

#endif /*INDICEARBOL_H_*/
